package org.dromara.easytl;

import org.dromara.easytl.exception.TemplateCompileException;

/**
 * 模板引擎主类
 * <p>
 * 负责模板的编译和管理，支持配置选项
 * </p>
 * 
 * @author gongjun
 * @since 1.0.0
 */
public class TemplateEngine {

    /**
     * 配置选项
     */
    private final TemplateEngineConfig config;

    /**
     * 构造函数，使用默认配置
     */
    public TemplateEngine() {
        this(new TemplateEngineConfig());
    }

    /**
     * 构造函数，使用自定义配置
     * 
     * @param config 配置选项
     */
    public TemplateEngine(final TemplateEngineConfig config) {
        this.config = config;
    }

    /**
     * 编译模板字符串
     * 
     * @param template 模板字符串
     * @return 编译后的模板对象
     * @throws TemplateCompileException 如果编译失败
     */
    public Template compile(final String template) {
        if (template == null) {
            throw new TemplateCompileException("模板字符串不能为 null");
        }

        // TODO: 实现模板编译逻辑
        // 1. 词法分析 (Lexer)
        // 2. 语法解析 (Parser)
        // 3. 生成 AST
        // 4. 编译为 Template 对象

        throw new UnsupportedOperationException("模板编译功能尚未实现");
    }

    /**
     * 获取配置选项
     * 
     * @return 配置选项
     */
    public TemplateEngineConfig getConfig() {
        return config;
    }

    /**
     * 模板引擎配置类
     */
    public static class TemplateEngineConfig {

        /**
         * 表达式语法类型
         */
        public enum BraceSyntax {
            /**
             * 单花括号语法：{expression}
             */
            SINGLE,

            /**
             * 双花括号语法：{{expression}}
             */
            DOUBLE,

            /**
             * 同时支持单花括号和双花括号
             */
            BOTH
        }

        /**
         * 花括号语法类型，默认为单花括号
         */
        private BraceSyntax braceSyntax = BraceSyntax.SINGLE;

        /**
         * 是否启用严格模式，默认为 false
         * <p>
         * 严格模式下，访问不存在的变量会抛出异常
         * </p>
         */
        private boolean strictMode = false;

        /**
         * 是否启用缓存，默认为 true
         */
        private boolean cacheEnabled = true;

        /**
         * 模板基础路径，用于 extends 功能
         */
        private String templateBasePath = "";

        /**
         * 获取花括号语法类型
         * 
         * @return 花括号语法类型
         */
        public BraceSyntax getBraceSyntax() {
            return braceSyntax;
        }

        /**
         * 设置花括号语法类型
         * 
         * @param braceSyntax 花括号语法类型
         * @return 配置对象本身，支持链式调用
         */
        public TemplateEngineConfig setBraceSyntax(final BraceSyntax braceSyntax) {
            this.braceSyntax = braceSyntax;
            return this;
        }

        /**
         * 是否启用严格模式
         * 
         * @return 如果启用严格模式返回 true，否则返回 false
         */
        public boolean isStrictMode() {
            return strictMode;
        }

        /**
         * 设置是否启用严格模式
         * 
         * @param strictMode 是否启用严格模式
         * @return 配置对象本身，支持链式调用
         */
        public TemplateEngineConfig setStrictMode(final boolean strictMode) {
            this.strictMode = strictMode;
            return this;
        }

        /**
         * 是否启用缓存
         * 
         * @return 如果启用缓存返回 true，否则返回 false
         */
        public boolean isCacheEnabled() {
            return cacheEnabled;
        }

        /**
         * 设置是否启用缓存
         * 
         * @param cacheEnabled 是否启用缓存
         * @return 配置对象本身，支持链式调用
         */
        public TemplateEngineConfig setCacheEnabled(final boolean cacheEnabled) {
            this.cacheEnabled = cacheEnabled;
            return this;
        }

        /**
         * 获取模板基础路径
         * 
         * @return 模板基础路径
         */
        public String getTemplateBasePath() {
            return templateBasePath;
        }

        /**
         * 设置模板基础路径
         * 
         * @param templateBasePath 模板基础路径
         * @return 配置对象本身，支持链式调用
         */
        public TemplateEngineConfig setTemplateBasePath(final String templateBasePath) {
            this.templateBasePath = templateBasePath;
            return this;
        }
    }
}

